perm filename DCOPY.SAI[11,HE]1 blob sn#546774 filedate 1980-11-23 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	BEGIN "disk image copy program"
C00009 ENDMK
C⊗;
BEGIN "disk image copy program"

DEFINE	CRLF="('15&'12)",
	! = "COMMENT ",
	TIL="STEP 1 UNTIL";

REQUIRE "11UTIL.HDR[11,SYS]" SOURCE_FILE;

DEFINE buflen = "'6000";

INTEGER bufadr,cyl,chan,brk,eof,cnt,flg,drv,sum,tmp,i,ck1,op;
SAFE INTEGER ARRAY foo[1:buflen];
STRING fname,s;

alinit;

chan ← getchan;
OPEN(chan,"DSK",'17,17,17,cnt,brk,eof);

WHILE TRUE DO BEGIN "loop"

PRINT("Read or Write (R/W): "); op ← IF (INCHWL LOR '40)="w" THEN TRUE ELSE FALSE;
PRINT("Disk name: "); fname ← inchwl; IF fname = NULL THEN CALL(0,"EXIT");
PRINT("Drive number: "); drv ← CVD(INCHWL);
POKE('1002,drv);				! Tell 11 which drive to use;

IF op THEN
  BEGIN				! Get ready to Write out;
  LOOKUP(chan,fname&".RSX",flg);
  IF flg THEN BEGIN PRINT("Can't find file - aborted"&crlf); CONTINUE END;
  PRINT("Type Y to confirm the write: "); IF (INCHWL LOR '40)≠"y" THEN CONTINUE;

  POKE('1004,2);					! Tell 11 to start writing;

  PRINT(crlf&"Starting write of: ",fname,crlf&"   cyl:  ");

  SUM ← 0;
  FOR cyl ← 1 TIL 203 DO
    BEGIN
    ARRYIN(chan,foo[1],buflen);			! Read it from disk;
    FOR i ← 1 TIL buflen DO			! Compute the checksum;
	Begin
	TMP ← SUM + (SUM lsh 1);
	SUM ← (SUM lsh 6) + (TMP lsh 2) + TMP + foo[i]
	End;
    WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP");	! Sleep for 1 tick;
    IF bufadr LAND 1 THEN
     BEGIN
     PRINT("Disk Error while writing cylinder ",cyl-2,crlf);
     CONTINUE "loop";
     END;
    POKEARRAY(bufadr,buflen,foo,TWRJ);		! Write the cylinder out;
    POKE('1000,0);			! Tell 11 we're done with buffer;
    IF (cyl MOD 20) = 0 THEN PRINT(cyl,"  ");
    END;
  WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Check 2nd last cyl was ok;
  IF bufadr LAND 1 THEN
    BEGIN
    PRINT("Disk Error while writing cylinder 202"&crlf);
    CONTINUE;
    END;
  POKE('1000,0);		      ! Tell 11 we're done with buffer;
  WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP"); ! Wait til 11 writes last cyl;
  IF bufadr LAND 1 THEN
    BEGIN
    PRINT("Disk Error while writing cylinder 203"&crlf);
    CONTINUE;
    END;
  POKE('1000,0);		      ! Tell 11 we're done with buffer;
  CLOSE(chan);
  ck1 ← sum;
  PRINT(crlf&"Confirming the write" & crlf & "   cyl:  ");
  END
 ELSE
  BEGIN
  ENTER(chan,fname&".RSX",flg);
  POKE('1004,1);					! Tell 11 to start reading;

  PRINT(crlf&"Starting read of: ",fname,crlf&"   cyl:  ");

  SUM ← 0;
  FOR cyl ← 1 TIL 203 DO
    BEGIN
    WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP");	! Sleep for 1 tick;
    IF bufadr LAND 1 THEN
     BEGIN
     PRINT("Disk Error while reading cylinder ",cyl-1,crlf);
     CONTINUE "loop";
     END;
    PEEKARRAY(bufadr,buflen,foo,TWRJ);		! Read the cylinder in;
    POKE('1000,0);			! Tell 11 we're done with buffer;
    ARRYOUT(chan,foo[1],buflen);			! Store it to disk;
    FOR i ← 1 TIL buflen DO		! Compute the checksum;
	Begin
	TMP ← SUM + (SUM lsh 1);
	SUM ← (SUM lsh 6) + (TMP lsh 2) + TMP + foo[i]
	End;
    IF (cyl MOD 20) = 0 THEN PRINT(cyl,"  ");
    END;
  CLOSE(chan);
  ck1 ← sum;
  PRINT(crlf&"Confirming the read" & crlf & "   cyl:  ");
  END;

POKE('1004,1);					! Tell 11 to start re-reading;

SUM ← 0;
FOR cyl ← 1 TIL 203 DO
  BEGIN
  WHILE (bufadr←peek('1000))=0 DO CALL(0,"SLEEP");	! Sleep for 1 tick;
  IF bufadr LAND 1 THEN
   BEGIN
   PRINT("Disk Error while reading cylinder ",cyl,crlf);
   CONTINUE "loop";
   END;
  PEEKARRAY(bufadr,buflen,foo,TWRJ);		! Read the cylinder in;
  POKE('1000,0);			! Tell 11 we're done with buffer;
  FOR i ← 1 TIL buflen DO		! Compute the checksum;
      Begin
      TMP ← SUM + (SUM lsh 1);
      SUM ← (SUM lsh 6) + (TMP lsh 2) + TMP + foo[i]
      End;
  IF (cyl MOD 20) = 0 THEN PRINT(cyl,"  ");
  END;

S ← "";
tmp ← abs(ck1);
While tmp neq 0 Do
  Begin
  S ← S & ("A" + (tmp mod 26));
  tmp ← tmp div 26;
  End;
IF ck1 = sum THEN PRINT(crlf & "Checksums match = ",S, " - Copy complete" & crlf)
 ELSE
    BEGIN
    PRINT(crlf & "Checksums don't match - Error" & crlf);
    S ← S & "	 ";
    SUM ← abs(SUM);
    While SUM neq 0 Do
      Begin
      S ← S & ("A" + (SUM mod 26));
      SUM ← SUM div 26;
      End;
    PRINT("  The two checksums: ",S,crlf);
    END;


END;
END;